// Stone XOR - ABC390 D题
// 题意：有N个袋子，每个袋子有A_i个石子，可以任意次将某个袋子的所有石子转移到另一个袋子
// 求最终所有袋子石子数的异或值有多少种可能的结果

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;
int n;

unordered_set<i64> st; // 存储所有可能的异或值
vector<i64> a;         // 存储每个袋子的初始石子数
vector<i64> stones;    // 当前的石子堆（每个堆代表一个袋子）

// DFS搜索所有可能的分配方案
// pos: 当前处理到第几个袋子
// xor_sum: 当前所有石子堆的异或和
void dfs(int pos, i64 xor_sum) {
  // 如果处理完所有袋子，记录当前的异或值
  if (pos == n) {
    st.insert(xor_sum);
    return;
  }

  // 选择1：将当前袋子的石子加到已有的某个堆中
  for (auto stone : stones) {
    // 保存当前状态
    i64 old_pile = stone;
    i64 old_xor = xor_sum;

    // 从异或和中移除原来的堆值
    xor_sum ^= stone;
    // 将当前袋子的石子加到堆中
    stone += a[pos];
    // 将新的堆值加入异或和
    xor_sum ^= stone;

    // 递归处理下一个袋子
    dfs(pos + 1, xor_sum);

    // 回溯：恢复原来的状态
    stone = old_pile;
    xor_sum = old_xor;
  }

  // 选择2：将当前袋子的石子作为新的堆
  stones.emplace_back(a[pos]);
  // 将新堆的值加入异或和
  dfs(pos + 1, xor_sum ^ a[pos]);
  // 回溯：移除新加的堆
  stones.pop_back();
}

int main() {
  cin >> n;
  a.resize(n);
  for (int i = 0; i < n; ++i) {
    cin >> a[i];
  }

  // 从第0个袋子开始搜索，初始异或和为0
  dfs(0, 0);

  // 输出不同异或值的数量
  cout << st.size() << endl;
  return 0;
}